package String

import (
	"fmt"
	"strings"
)

func isBlank(param string) bool {
	tests := []string{" ", "\t", "\n", "\u000B", "\f", "\r", "\u001C", "\u001D", "\u001E", "\u001F"}

	data := param
	for _, test := range tests {
		data = strings.ReplaceAll(data, test, "")
	}

	return len(data) == 0

}

func CamelToUnderline(param string) string {
	if isBlank(param) {
		return ""
	} else {
		length := len(param)
		sb := ""

		for i := 0; i < length; i++ {
			c := param[i : i+1]

			if strings.ToUpper(c) == c && i > 0 {
				sb += "_"
			}

			sb += strings.ToLower(c)
		}

		return sb
	}
}

func CamelName(name string) string {
	result := ""
	// 快速检查
	if name == "" {
		// 没必要转换
		return ""
	} else if strings.Count(name, "_") == 0 {
		// 不含下划线，仅将首字母小写
		return strings.ToLower(name[0:1]) + name[1:]
	}
	// 用下划线将原始字符串分割
	camels := strings.Split(name, "_")
	for _, camel := range camels {
		// 跳过原始字符串中开头、结尾的下换线或双重下划线
		if camel == "" {
			continue
		}

		// 处理真正的驼峰片段
		if len(result) == 0 {
			// 第一个驼峰片段，全部字母都小写
			result += strings.ToLower(camel)
		} else {
			// 其他的驼峰片段，首字母大写
			result += strings.ToUpper(camel[0:1])
			result += strings.ToLower(camel[1:])
		}
	}

	return result
}

func ToString(value interface{}) string {
	return fmt.Sprintf("%v", value)
}

func SplitLines(text string) []string {
	str := strings.ReplaceAll(text, "\r", "\n")
	lines := strings.Split(str, "\n")
	return lines
}
